# 1. 集合（set）元素去重的判断依据是什么
# 首先元素本身是否可hash，即该元素class实现了实例的__hash__魔术方法，可以返回hash值，其次需要判断两个对象是否相等，
# 即这两个对象的class实现了实例的__eq__魔术方法，去重依赖__eq__，__eq__计算后的结果相等则判断有重复
# 2. 总结本周视频讲解魔术方法的作用及什么情况会执行到该方法
# __new__
# 实例化一个对象
# 该方法需要返回一个值，如果该值不是cls的实例，则不会调用__init__
# 该方法永远都是静态方法
# __new__ 方法很少使用，即使创建了该方法，也会使用return super().__new__(cls) 基类object的
# __new__ 方法来创建实例并返回。

#__str__
# str()函数、format()函数、print()函数调用，需要返回对象的字符串表达。如果没
# 有定义，就去调用__repr__ 方法返回字符串表达，如果__repr__ 没有定义，就
# 直接返回对象的内存地址信息

#__repr__
# 内建函数repr()对一个对象获取字符串表达。
# 调用__repr__ 方法返回字符串表达，如果__repr__ 也没有定义，就直接返回
# object的定义就是显示内存地址信息

#__bytes__
# bytes()函数调用，返回一个对象的bytes表达，即返回bytes对象

#__bool__
# 内建函数bool()，或者对象放在逻辑表达式的位置，调用这个函数返回布尔值。
# 没有定义__bool__ ()，就找__len__ ()返回长度，非0为真。
# 如果__len__ ()也没有定义，那么所有实例都返回真

# 3.
# 结合本周所学内容，实现如下类：
#
# class Ob:
#     pass
#
#
# 执行以下操作：
# a = Ob('tom')
# b = Ob('tom')
# print('a: ', a)
# a[0] = 'a'
# print('a:', a)
# a * 3
# print('len: ', len(a))
# del a[1]
# print('a: ', a)
# print('set: ', {a, b})
#
# 其输出如下：
# a: ['1', '2']
# a: ['a', '2']
# len: 6
# a: ['a', 'a', '2', 'a', '2']
# set: { < Ob
# name = tom
# items = ['a', 'a', '2', 'a', '2'] >}

class Ob:
    def __init__(self,name):
        self.name = name
        self.item = ["1","2"]

    def __str__(self):
        return str(self.item)

    def __iter__(self,reverse=False):
        return iter(self.item)

    def __getitem__(self, index):
        return self.item[index]

    def __setitem__(self, index, value):
        self.item[index] = value

    def __mul__(self, other):
        self.item = self.item * other

    def __len__(self):
        return len(self.item)

    def __delitem__(self, index):
        del self.item[index]

    def __hash__(self):
        return hash(self.name)

    def __eq__(self, other):
        return self.name == other.name

    def __repr__(self):
        return "< {} name = {} items = {} >".format(self.__class__.__name__,self.name,self.item)

a = Ob('tom')
b = Ob('tom')
print('a:',a)
a[0] = 'a'
print('a:',a)
a * 3
print('len:',len(a))
del a[1]
print('a:',a)
print('set: ', {a, b})


